package javabasics;


import javax.servlet.*;
import java.io.IOException;
/**
 *Filter是如何实现拦截的？(Filter的工作原理)
 * Filter接口中有一个doFilter方法，当我们编写好Filter，并配置对哪个web资源进行拦截后，WEB服务器每次在调用web资源的service方法之前，
 * 都会先调用一下filter的doFilter方法，因此，在该方法内编写代码可达到如下目的：
 * 调用目标资源之前，让一段代码执行。
 * 是否调用目标资源（即是否让用户访问web资源）。
 * 调用目标资源之后，让一段代码执行。
 * web服务器在调用doFilter方法时，会传递一个filterChain对象进来，filterChain对象是filter接口中最重要的一个对象，它也提供了一个
 * doFilter方法，开发人员可以根据需求决定是否调用此方法，调用该方法，则web服务器就会调用web资源的service方法，即web资源就会被访问，
 * 否则web资源不会被访问。
 * */
public class TestFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

        System.out.println("--filter初始化--");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        /**拦截的主要方法，判断是否让用户访问web资源
         * filterChain也提供了一个
         *doFilter方法，开发人员可以根据需求决定是否调用此方法，调用该方法，则web服务器就会调用web资源的service方法，即web资源就会被访问，
         *否则web资源不会被访问。
         * */
        servletRequest.setCharacterEncoding("UTF-8");
        servletResponse.setCharacterEncoding("UTF-8");
        servletResponse.setContentType("text/html;charset=UTF-8");
        System.out.println("----调用service之前执行一段代码----");
        filterChain.doFilter(servletRequest, servletResponse); // 执行目标资源，放行
        System.out.println("----调用service之后执行一段代码----");
    }

    @Override
    public void destroy() {
        System.out.println("-----filter销毁------");
    }
}
